package com.sergio.accounting.repository;

import com.sergio.accounting.entity.Account;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Optional;

/**
 * 账户仓库接口
 */
@Repository
public interface AccountRepository extends JpaRepository<Account, Long> {

    /**
     * 根据用户ID查找所有启用的账户，按排序顺序排列
     */
    List<Account> findByUserIdAndEnabledTrueOrderBySortOrderAsc(Long userId);

    /**
     * 根据用户ID查找所有账户，按排序顺序排列
     */
    List<Account> findByUserIdOrderBySortOrderAsc(Long userId);

    /**
     * 根据用户ID和账户类型查找账户
     */
    List<Account> findByUserIdAndAccountTypeAndEnabledTrue(Long userId, Account.AccountType accountType);

    /**
     * 根据用户ID和账户ID查找账户
     */
    Optional<Account> findByIdAndUserId(Long id, Long userId);

    /**
     * 查找用户的默认账户（"不计入账户"类型）
     */
    Optional<Account> findByUserIdAndAccountType(Long userId, Account.AccountType accountType);

    /**
     * 统计用户的账户总数
     */
    long countByUserIdAndEnabledTrue(Long userId);

    /**
     * 查询用户所有计入总额的账户余额总和
     */
    @Query("SELECT COALESCE(SUM(a.currentBalance), 0) FROM Account a WHERE a.userId = :userId AND a.enabled = true AND a.includeInTotal = true")
    java.math.BigDecimal getTotalBalanceByUserId(@Param("userId") Long userId);

    /**
     * 检查账户是否存在且属于指定用户
     */
    boolean existsByIdAndUserId(Long id, Long userId);

    /**
     * 根据用户ID和启用状态查找账户
     */
    List<Account> findByUserIdAndEnabled(Long userId, boolean enabled);
}
